#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
from typing import Dict, Any, Optional
import os

from document_processor.engines.base_engine import BaseEngine
from document_processor.engines.markitdown_engine import MarkItDownEngine
from document_processor.engines.word_engine import WordEngine
from document_processor.engines.pdfminer_engine import PDFMinerEngine
from document_processor.engines.mineru_client import MinerUClient

logger = logging.getLogger(__name__)

class EngineFactory:
    """文档处理引擎工厂，负责创建合适的文档处理引擎"""
    
    @staticmethod
    def get_engine(file_name: str, parser_option: str, config: Dict[str, Any]) -> Optional[BaseEngine]:
        """根据文件类型和解析选项创建合适的引擎实例
        
        Args:
            file_name: 文件名
            parser_option: 解析选项，可选值："markitdown"（基础解析）、"advanced"（高级解析）或"mineru"（高级引擎）
            config: 引擎配置信息
            
        Returns:
            创建的引擎实例，如果不支持则返回None
        """
        file_ext = os.path.splitext(file_name)[1].lower()
        parser_option = parser_option.lower()
        
        try:
            # 基础解析模式，使用 MarkItDown
            if parser_option == "markitdown":
                try:
                    from markitdown import MarkItDown
                    logger.info("MarkItDown依赖已加载")
                    return MarkItDownEngine(config)
                except ImportError:
                    logger.error("未安装MarkItDown依赖，请执行: pip install markitdown[all]>=0.1.0")
                    raise ImportError("未安装MarkItDown依赖，请执行: pip install markitdown[all]>=0.1.0")
            
            # MinerU 服务模式，调用独立的 MinerU 服务
            elif parser_option == "mineru":
                logger.info("使用 MinerU 服务模式")
                return MinerUClient(config)
            
            # 高级解析模式，根据文件类型选择引擎
            elif parser_option == "advanced":
                if file_ext in ['.doc', '.docx']:
                    return WordEngine(config)
                elif file_ext == '.pdf':
                    return PDFMinerEngine(config)
                else:
                    logger.warning(f"高级解析模式不支持的文件格式: {file_ext}")
                    return MarkItDownEngine(config)  # 降级使用基础解析
            
            else:
                logger.warning(f"不支持的解析选项: {parser_option}")
                return None
                
        except Exception as e:
            logger.error(f"创建引擎实例失败: {str(e)}")
            raise
            
    @staticmethod
    def get_engine_by_file(file_name: str, config: Dict[str, Any]) -> Optional[BaseEngine]:
        """根据文件类型自动选择合适的引擎
        
        Args:
            file_name: 文件名
            config: 引擎配置信息
            
        Returns:
            创建的引擎实例，如果文件类型不支持则返回None
        """
        file_ext = os.path.splitext(file_name)[1].lower()
        
        # 根据文件扩展名选择引擎
        if file_ext in ['.doc', '.docx']:
            return WordEngine(config)
        elif file_ext == '.pdf':
            # 优先使用 PDFMiner
            return PDFMinerEngine(config)
        else:
            # 其他格式使用 MarkItDown
            return MarkItDownEngine(config) 